#include "rtspstreammanage.h"

/*========================================================== 
    函数名 ：   CreateRtspStreamManage
    功能 ：		创建rtsp会话节点管理类
    算法实现 ： <可选项> 
    参数说明 ： 
    返回值说明：NULL创建失败，否则返回管理类地址（管理类列释放需要调用 DeleteRtspStreamManage方法）
    ------------------------------------------------------------------------------------------------------- 
    修改记录 ： 日 期 版本 修改人 走读人 修改记录
    1998/09/15 V1.0 某某（中文） 某某（中文） 记录关键内容
===========================================================*/
PRtspStreamManage CreateRtspStreamManage()
{
    PRtspStreamManage ptManage = (PRtspStreamManage)malloc(sizeof(RtspStreamManage));
    if(NULL == ptManage)
    {
        TRACE_DEBUG("malloc RtspStreamManage failed");
        return NULL;
    }
    ptManage->ptHead = NULL;
    ptQueue->ptMutex = (PMutex)malloc(sizeof(Mutex));
    MUTEX_INIT(ptQueue->ptMutex);
    return ptManage;
}


/*========================================================== 
    函数名 ：   DeleteRtspStreamManage
    功能 ：		释放rtsp会话节点管理类
    算法实现 ： <可选项> 
    参数说明 ： PRtspStreamManage     ptManage     [in]    rtsp会话节点管理类指针
    返回值说明：
    ------------------------------------------------------------------------------------------------------- 
    修改记录 ： 日 期 版本 修改人 走读人 修改记录
    1998/09/15 V1.0 某某（中文） 某某（中文） 记录关键内容
===========================================================*/
void DeleteRtspStreamManage(PRtspStreamManage ptManage)
{
    if(NULL == ptManage)
    {
        return ;
    }

    MUTEX_LOCK(ptManage->ptMutex);
    PRtspStreamItem ptItem = ptManage->ptHead;
    while(NULL != ptItem)
    {
        PRtspStreamItem ptNext = ptItem->pNext;
        free(ptItem);
        ptItem = ptNext;
    }
    MUTEX_DESTORY(ptManage->ptMutex);
    free(ptManage);
    return ;
}

/*========================================================== 
    函数名 ：   AppendRtspStreamItem
    功能 ：		添加rtspstream 节点
    算法实现 ： <可选项> 
    参数说明 ： PRtspStreamManage     ptManage     [in]    rtsp会话节点管理类指针
                PRtspStreamItem      ptItem       [in]    要加入管理的rtsp会话节点
    返回值说明：0 成功 -1 失败
    ------------------------------------------------------------------------------------------------------- 
    修改记录 ： 日 期 版本 修改人 走读人 修改记录
    1998/09/15 V1.0 某某（中文） 某某（中文） 记录关键内容
===========================================================*/
int AppendRtspStreamItem(PRtspStreamManage ptManage,PRtspStreamItem ptItem)
{
    if(NULL == ptManage || NULL == ptItem)
    {
        TRACE_DEBUG("argument is null");
        return -1;
    }

    if(NULL == ptManage->ptHead)
    {
        ptManage->ptHead = ptItem;
    }
    else
    {
        PRtspStreamItem pTailItem = ptManage->ptHead;
        while(NULL != pTailItem->pNext)
        {
            pTailItem = pTailItem->pNext;
        }
        pTailItem->pNext = ptItem;
        ptItem->pNext = NULL;
    }
    return 0;
}

/*========================================================== 
    函数名 ：   AppendRtspStreamItemInfo
    功能 ：		添加rtspstream 节点
    算法实现 ： <可选项> 
    参数说明 ： PRtspStreamManage     ptManage     [in]    rtsp会话节点管理类指针
                int      nSessionId       [in]    会话id
                char*    pchUrl           [in]    拉流地址
                char*    pchPlayType      [in]    播放类型
    返回值说明：0 成功 -1 失败
    ------------------------------------------------------------------------------------------------------- 
    修改记录 ： 日 期 版本 修改人 走读人 修改记录
    1998/09/15 V1.0 某某（中文） 某某（中文） 记录关键内容
===========================================================*/
int AppendRtspStreamItemInfo(PRtspStreamManage ptManage,int nSessionId,char *pchUrl,char *pchPlayType)
{
    if(NULL == ptManage || nSessionId <= 0 || NULL == pchUrl || NULL == pchPlayType)
    {
        return -1;
    }
    PRtspStreamItem pNewItem = (PRtspStreamItem)malloc(RtspStreamItem);
    memset(pNewItem,0,sizeof(RtspStreamItem));

    pNewItem->nSessionId = nSessionId;
    strncpy(pNewItem->achUrl,pchUrl,POST_PARAM_VAL_BUF_LEN);
    strncpy(pNewItem->achPlayType,pchPlayType,POST_PARAM_VAL_BUF_LEN);
    
    int nAppRet = AppendRtspStreamItem(ptManage,pNewItem);
    return nAppRet;
}

/*========================================================== 
    函数名 ：   DeleteRtspStreamItem
    功能 ：		删除rtspstream 节点
    算法实现 ： <可选项> 
    参数说明 ： PRtspStreamManage     ptManage     [in]    rtsp会话节点管理类指针
                int      nSessionId       [in]    会话id
    返回值说明：
    ------------------------------------------------------------------------------------------------------- 
    修改记录 ： 日 期 版本 修改人 走读人 修改记录
    1998/09/15 V1.0 某某（中文） 某某（中文） 记录关键内容
===========================================================*/
void DeleteRtspStreamItem(PRtspStreamManage ptManage,int nSessionId)
{
    // 参数校验
    if(NULL == ptManage)
    {
        return ;
    }

    MUTEX_LOCK(ptManage->ptMutex);
    // 如果链表为空直接返回
    if(NULL == ptManage->ptHead)
    {
        MUTEX_UNLOCK(ptManage->ptMutex);
        return ;
    }

    // 如果第一个元素为要删除的元素
    if(ptManage->ptHead->nSessionId == nSessionId)
    {
        PRtspStreamItem pDelete = ptManage->ptHead;
        ptManage->ptHead = ptManage->ptHead->pNext;
        free(pDelete);
        MUTEX_UNLOCK(ptManage->ptMutex);
        return ;
    }

    // 普通元素删除
    PRtspStreamItem pFrontItem = ptManage->ptHead;
    PRtspStreamItem pItem = pFrontItem->pNext;
    while(NULL != pItem)
    {
        if(pItem->nSessionId == nSessionId)
        {
            pFrontItem->pNext = pItem->pNext;
            free(pItem);
            break;
        }
        pFrontItem = pItem;
        pItem = pItem->pNext;
    }
    MUTEX_UNLOCK(ptManage->ptMutex);
    return ;
}

/*========================================================== 
    函数名 ：   ExistsRtspStreamItem
    功能 ：		判断rtspstream 节点是否存在
    算法实现 ： <可选项> 
    参数说明 ： PRtspStreamManage     ptManage     [in]    rtsp会话节点管理类指针
                int      nSessionId       [in]    会话id
    返回值说明：0 不存在 1 存在
    ------------------------------------------------------------------------------------------------------- 
    修改记录 ： 日 期 版本 修改人 走读人 修改记录
    1998/09/15 V1.0 某某（中文） 某某（中文） 记录关键内容
===========================================================*/
int ExistsRtspStreamItem(PRtspStreamManage ptManage,int nSessionId)
{
    // 参数校验
    if(NULL == ptManage)
    {
        return 0;
    }

    // 如果链表为空直接返回
    if(NULL == ptManage->ptHead)
    {
        return 0;
    }

    PRtspStreamItem pItem = ptManage->ptHead;
    while(NULL != pItem)
    {
        if(pItem->nSessionId == nSessionId)
        {
            return 1;
        }
        pItem = pItem->pNext;
    }
    return 0;
}

/*========================================================== 
    函数名 ：   ExistsRtspStreamItemLock
    功能 ：		判断rtspstream 节点是否存在,内部加锁
    算法实现 ： <可选项> 
    参数说明 ： PRtspStreamManage     ptManage     [in]    rtsp会话节点管理类指针
                int      nSessionId       [in]    会话id
    返回值说明：0 不存在 1 存在
    ------------------------------------------------------------------------------------------------------- 
    修改记录 ： 日 期 版本 修改人 走读人 修改记录
    1998/09/15 V1.0 某某（中文） 某某（中文） 记录关键内容
===========================================================*/
int ExistsRtspStreamItemLock(PRtspStreamManage ptManage,int nSessionId)
{
    // 参数校验
    if(NULL == ptManage)
    {
        return 0;
    }

    MUTEX_LOCK(ptManage->ptMutex);
    int nExists = 0;
    // 如果链表为空直接返回
    if(NULL == ptManage->ptHead)
    {
        nExists = 0;
    }
    else
    {
        PRtspStreamItem pItem = ptManage->ptHead;
        while(NULL != pItem)
        {
            if(pItem->nSessionId == nSessionId)
            {
                nExists = 1;
                break;
            }
            pItem = pItem->pNext;
        }
    }
    MUTEX_UNLOCK(ptManage->ptMutex);
    return nExists;
}

/*========================================================== 
    函数名 ：   RtspStreamManageLock
    功能 ：		RtspStreamManage加锁
    算法实现 ： <可选项> 
    参数说明 ： PRtspStreamManage     ptManage     [in]    rtsp会话节点管理类指针
    返回值说明：
    ------------------------------------------------------------------------------------------------------- 
    修改记录 ： 日 期 版本 修改人 走读人 修改记录
    1998/09/15 V1.0 某某（中文） 某某（中文） 记录关键内容
===========================================================*/
void RtspStreamManageLock(PRtspStreamManage ptManage)
{
    MUTEX_LOCK(ptManage->ptMutex);
}

/*========================================================== 
    函数名 ：   RtspStreamManageUnLock
    功能 ：		RtspStreamManage解锁
    算法实现 ： <可选项> 
    参数说明 ： PRtspStreamManage     ptManage     [in]    rtsp会话节点管理类指针
    返回值说明：
    ------------------------------------------------------------------------------------------------------- 
    修改记录 ： 日 期 版本 修改人 走读人 修改记录
    1998/09/15 V1.0 某某（中文） 某某（中文） 记录关键内容
===========================================================*/
void RtspStreamManageUnLock(PRtspStreamManage ptManage)
{
    MUTEX_UNLOCK(ptManage->ptMutex);
}